import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Calendar;
import java.util.Objects;

/**
 * File 类
 * <p>
 * 文件路径的表示方式：
 * 绝对路径：
 * 相对路径：在IDEA中，
 * -如果使用单元测试方法：相对于当前的module来讲
 * -如果使用main()方法：相对于当前的project来讲
 * <p>
 * File类位于java.io包下
 * File类的一个对象，对应操作系统下的一个文件或一个文件目录
 * File类中声明了新建、删除、获取名称、重命名等方法，并没有涉及到文件内容的读写操作。
 * 需要使用IO流，才能够实现文件内容的读写。
 * File类的对象，通常是作为IO流操作的文件的端点出现的。
 */
public class FileTest {
    @Test
    public void test1() {
        File file1 = new File("E://Code//file.txt");

        // 参数1：一定是一个文件目录
        // 参数2：可以是一个文件，也可以是一个文件目录
        File file2 = new File("E://Code", "test.txt");
        File file3 = new File("E://Code", "Java");

        File file4 = new File(file3, "ab.txt");
        System.out.println(file4); // E:\Code\Java\ab.txt

    }

    @Test
    public void test2() {
        File file = new File("File.iml");
        System.out.println(file.getName());
        System.out.println(file.exists()); // true
        System.out.println(file.getParent()); // null
        System.out.println(file.getAbsoluteFile().getParent()); // D:\Code\Java\learning\File
        System.out.println(file.getAbsolutePath()); // D:\Code\Java\learning\File\File.iml
        System.out.println(file.length()); // 769
        System.out.println(file.lastModified()); // 1741774999247
//        System.out.println(new Date(1741774999247L));
//        System.out.println(new Date(System.currentTimeMillis()));
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        System.out.println(calendar.getTime());

    }

    @Test
    public void test3() {
        File file = new File("E:\\研究生\\研一");
        String[] list = file.list();
        if (list != null)
            for (String s :
                    list) {
                System.out.println(s);
            }
        for (File listFile : Objects.requireNonNull(file.listFiles())) {
            System.out.println(listFile);
        }
        File[] listFiles = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory();
            }
        });
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>");
        for (File f : Objects.requireNonNull(listFiles)) {
            System.out.println(f.getName());
        }
    }

    @Test
    public void test4() {
        File file1 = new File("Hello.txt");
        File file2 = new File("E:\\下载\\tst.txt");
        /*
        file1.renameTo(file2):要想执行成功，返回true。要求：
            file1必须存在
            file2必须不存在，且file2苏哦在的文件目录必须存在。
         */
        System.out.println(file1.renameTo(file2) ? "OK" : "Err");
    }

    @Test
    public void test5() throws IOException {
        // 判断功能
        File file1 = new File("tst.txt");
        System.out.println(file1.isFile());
        System.out.println(file1.isAbsolute());
        System.out.println(file1.isHidden());
        System.out.println(file1.isDirectory());

        File file2 = new File("tsta");
        // 创建删除功能
        if (!file1.exists()) {
            System.out.println(file1.createNewFile());
        } else if (file1.exists()) {
            // 删除文件或目录
            System.out.println(file1.delete());
        }

        // 创建文件目录。若此文件目录存在或此文件目录的上层目录不存在，不创建，返回false。
        System.out.println(file2.mkdir());


        File file3 = new File("src\\test\\com");
        if (!file3.exists()) {
            // 创建文件目录。若上层文件目录存在，一并创建。
            System.out.println(file3.mkdirs());
        }
    }

    /**
     * 遍历整个文件夹，返回文件夹结构
     */
    @Test
    public void testExr() {
        File file = new File("E:\\研究生\\研一"); // 顶层文件夹
        printDirsAndFiles(file, 0);
    }

    void printDirsAndFiles(File file, int level) {
        if (file.isDirectory()) {
            for (int i = 0; i < level; i++) {
                System.out.print('\t');
            }
            System.out.println(file.getName());// 打印目录名

            File[] listFiles = file.listFiles();
            for (File f : Objects.requireNonNull(listFiles)) {
                printDirsAndFiles(f, level + 1);
            }
        } else if (file.isFile()) {
            for (int i = 0; i < level; i++) {
                System.out.print('\t');
            }
            System.out.println(file.getName());
        }
    }
}
